package br.com.upis.sispat.view;

import java.io.Serializable;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.application.FacesMessage.Severity;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;

import br.com.upis.sispat.entity.Setor;
import br.com.upis.sispat.entity.Usuario;
import br.com.upis.sispat.enums.Perfil;
import br.com.upis.sispat.enums.TipoAcaoPopUp;
import br.com.upis.sispat.exception.SeamCoreException;
import br.com.upis.sispat.exception.SeamWebException;
import br.com.upis.sispat.service.SetorService;
import br.com.upis.sispat.util.MessagesUtil;

public abstract class AbstractView implements Serializable {

	private static final long serialVersionUID = 7999224666520821812L;
	public static final String PATH_PAGINA_ERRO = "/paginaErro";
	public static final String CONTEXT = "";
	public static String MENSAGEM_ERRO = "";
	private Integer acaoPopUp;
	private boolean exibePopup;
	private String mensagemTextoPopUp;
	private String tituloPopup;
	private boolean exibeMsgNenhumRegistroEncontrado;
	private SelectItem[] listaSetor;
	@Autowired
	private SetorService setorService;

	public abstract String iniciar() throws SeamWebException;

	public abstract String pesquisar() throws SeamWebException;

	public abstract String novo() throws SeamWebException;

	public abstract String detalhar() throws SeamWebException;

	public abstract String editar() throws SeamWebException;

	public abstract String salvar() throws SeamWebException;

	public abstract String atualizar() throws SeamWebException;

	public abstract String excluir() throws SeamWebException;

	protected HttpSession getCurrentSession() {

		if (FacesContext.getCurrentInstance() != null) {
			return (HttpSession) FacesContext.getCurrentInstance()
					.getExternalContext().getSession(true);
		}

		return null;
	}

	protected Usuario recuperaUsuarioLogado() {
		return (Usuario) getCurrentSession().getAttribute("usuarioLogado");
	}

	public abstract boolean possuiAcesso(Perfil perfil);

	public abstract String voltar() throws SeamWebException;

	protected void addMessage(Severity severity, String msg) {
		FacesContext.getCurrentInstance().addMessage(null,
				new FacesMessage(severity, msg, msg));
	}

	protected void addMessageInfo(String msg) {

		String mensagem = null;
		try {
			mensagem = getMensagemBundle(msg);
		} catch (Exception e) {
			e.printStackTrace();
		}

		if (mensagem == null) {
			mensagem = msg;
		}

		FacesContext.getCurrentInstance()
				.addMessage(
						null,
						new FacesMessage(FacesMessage.SEVERITY_INFO, mensagem,
								mensagem));
	}

	protected void addMessageError(String msg) {

		String mensagem = null;
		try {
			mensagem = getMensagemBundle(msg);
		} catch (Exception e) {
			e.printStackTrace();
		}

		if (mensagem == null) {
			mensagem = msg;
		}
		FacesContext.getCurrentInstance().addMessage(
				null,
				new FacesMessage(FacesMessage.SEVERITY_ERROR, mensagem,
						mensagem));
	}

	protected void addMessageError(String msg, Object... parameters) {

		String mensagem = null;
		try {
			mensagem = getMensagemBundle(msg, parameters);
		} catch (Exception e) {
			e.printStackTrace();
		}

		if (mensagem == null) {
			mensagem = msg;
		}
		FacesContext.getCurrentInstance().addMessage(
				null,
				new FacesMessage(FacesMessage.SEVERITY_ERROR, mensagem,
						mensagem));
	}

	protected String getMensagemBundle(String codigoMsg) {
		return MessagesUtil.getMessage(codigoMsg);
	}

	protected String getMensagemBundle(String codigoMsg, Object... parameters) {
		return MessagesUtil.getMessage(codigoMsg, parameters);
	}

	public Integer getAcaoPopUp() {
		return acaoPopUp;
	}

	public void setAcaoPopUp(Integer acaoPopUp) {
		this.acaoPopUp = acaoPopUp;
	}

	public boolean isExibePopup() {

		return exibePopup;
	}

	public void setExibePopup(boolean exibePopup) {
		this.exibePopup = exibePopup;
	}

	public String getTituloPopUp() {
		return TipoAcaoPopUp.getAcaoByCodigo(getAcaoPopUp()).getDescricao();
	}

	public String getTextoPopup() {
		if (getAcaoPopUp() != null && getAcaoPopUp() == 4) {

			tituloPopup = getMensagemTextoPopUp();
		} else {

			tituloPopup = TipoAcaoPopUp.getAcaoByCodigo(getAcaoPopUp())
					.getTexto();
		}

		return tituloPopup;
	}

	public String getMensagemTextoPopUp() {
		return mensagemTextoPopUp;
	}

	public void setMensagemTextoPopUp(String mensagemTextoPopUp) {
		this.mensagemTextoPopUp = mensagemTextoPopUp;
	}

	public String getTituloPopup() {
		return tituloPopup;
	}

	public void setTituloPopup(String tituloPopup) {
		this.tituloPopup = tituloPopup;
	}

	public String popupSalvar() throws SeamWebException {
		if (validaForm()) {
			setExibePopup(false);
			return "";
		}
		setExibePopup(true);
		setAcaoPopUp(TipoAcaoPopUp.ACAO_POPUP_INCLUIR.getCodigo());
		return novo();
	}

	public abstract boolean validaForm() throws SeamWebException;

	public String popupAtualizar() throws SeamWebException {
		if (validaForm()) {
			setExibePopup(false);
			return "";
		}
		setExibePopup(true);
		setAcaoPopUp(TipoAcaoPopUp.ACAO_POPUP_ALTERAR.getCodigo());
		return editar();
	}

	public String popupExcluir() throws SeamWebException {
		setExibePopup(true);
		setAcaoPopUp(TipoAcaoPopUp.ACAO_POPUP_EXCLUIR.getCodigo());
		return pesquisar();
	}

	public boolean isPerfilGestor() {
		return recuperaUsuarioLogado().getIdAcesso().compareTo(
				Perfil.PERFIL_GESTOR.getCodigoPerfil()) == 0;
	}

	public boolean isPerfilGerente() {
		return recuperaUsuarioLogado().getIdAcesso().compareTo(
				Perfil.PERFIL_GERENTE.getCodigoPerfil()) == 0;
	}

	public boolean isPerfilFUncionario() {
		return recuperaUsuarioLogado().getIdAcesso().compareTo(
				Perfil.PERFIL_FUNCIONARIO.getCodigoPerfil()) == 0;
	}

	public boolean isExibeMsgNenhumRegistroEncontrado() {
		return exibeMsgNenhumRegistroEncontrado;
	}

	public void setExibeMsgNenhumRegistroEncontrado(
			boolean exibeMsgNenhumRegistroEncontrado) {
		this.exibeMsgNenhumRegistroEncontrado = exibeMsgNenhumRegistroEncontrado;
	}

	public SelectItem[] getListaSetor() {
		if (listaSetor != null) {
			return listaSetor;
		}
		try {
			List<Setor> listaSetor = setorService.search(new Setor());
			this.listaSetor = new SelectItem[listaSetor.size()];
			int i = 0;
			for (Setor s : listaSetor) {
				this.listaSetor[i++] = new SelectItem(s.getCodigo(),
						s.getNomeSetor());
			}
		} catch (SeamCoreException e) {
			e.printStackTrace();
		}

		return listaSetor;
	}

	public void setListaSetor(SelectItem[] listaSetor) {
		this.listaSetor = listaSetor;
	}

	public SetorService getSetorService() {
		return setorService;
	}

	public void setSetorService(SetorService setorService) {
		this.setorService = setorService;
	}

}
